package br.com.sgh.beans;

import br.com.sgh.dao.AcervoDAO;
import br.com.sgh.dao.EmprestimoDAO;
import br.com.sgh.dao.FuncionarioDAO;
import br.com.sgh.entidade.Acervo;
import br.com.sgh.entidade.Emprestimo;
import br.com.sgh.entidade.Funcionario;
import br.com.sgh.util.FacesContextUtil;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

@ManagedBean
@ViewScoped
public class EmprestimoBean implements Serializable {

    private static final long serialVersionUID = 1L;

    private Emprestimo emprestimo;
    private List<Emprestimo> emprestimos;
    private List<Acervo> acervos;
    private Acervo acervo;
    private Integer codAcervo;

    private EmprestimoDAO emprestimoDao() {
        EmprestimoDAO<Emprestimo> dao = new EmprestimoDAO<Emprestimo>(Emprestimo.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private AcervoDAO acervoDao() {
        AcervoDAO<Acervo> dao = new AcervoDAO<Acervo>(Acervo.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    private FuncionarioDAO funcionarioDao() {
        FuncionarioDAO<Funcionario> dao = new FuncionarioDAO<Funcionario>(Funcionario.class, FacesContextUtil.getRequestSession());
        return dao;
    }

    public String devolucao() {
        return "/restrito/emprestimo.faces";
    }

    public String solicitarEmprestimo() {
        if (emprestimoDao().disponibilidadeAcervo(codAcervo)) {
            acervos = acervoDao().acervosEmprestimo(codAcervo);
            if (acervos.size() > 0) {
                acervo = new Acervo();
                acervo = acervos.get(0);
                emprestimo = new Emprestimo();
                emprestimo.setAcervo(acervo);
                emprestimo.setFuncionario(usuarioLogado());
                emprestimo.setPrevisaoEntrega(dataDevolucao(acervo.getDiasemprestimo()));
                emprestimo.setDataEmprestimo(new Date());
            } else {
                emprestimo = new Emprestimo();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Acervo não encontrado no Sistema - Consulte o responsavel", "Aviso"));

            }
        } else {
            emprestimo = null;
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Acervo não devolvido no Sistema - Consulte o responsavel", "Aviso"));
        }
        return null;
    }

    /*private void solicitarEmprestimo2() {
     if (emprestimoDao().disponibilidadeAcervo(codAcervo)) {
     acervos = acervoDao().acervosEmprestimo(codAcervo);
     if (acervos.size() > 0) {
     acervo = new Acervo();
     acervo = acervos.get(0);
     emprestimo = new Emprestimo();
     emprestimo.setAcervo(acervo);
     emprestimo.setFuncionario(usuarioLogado());
     emprestimo.setPrevisaoEntrega(dataDevolucao(acervo.getDiasemprestimo()));
     emprestimo.setDataEmprestimo(new Date());
     } else {
     emprestimo = new Emprestimo();
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Acervo não encontrado no Sistema - Consulte o responsavel", "Aviso"));
                
     }
     } else {
     emprestimo = null;
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Acervo não devolvido no Sistema - Consulte o responsavel", "Aviso"));
     }
     }*/
    private Date dataDevolucao(Integer dias) {
        Date d = new Date();
        d.setDate(d.getDate() + dias);
        return d;
    }

    private Funcionario usuarioLogado() {
        FacesContext context = FacesContext.getCurrentInstance();
        ExternalContext external = context.getExternalContext();
        String login = external.getRemoteUser();

        List<Funcionario> lista = funcionarioDao().verificaLogin(login);
        Funcionario f = lista.get(0);
        return f;
    }

    public String confirmarEmpretimo() {
        if (emprestimo.getCodEmprestimo() == null || emprestimo.getCodEmprestimo() < 1) {
            emprestimoDao().salvar(emprestimo);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Emprestimo Realizado com Sucesso!", null));
            this.codAcervo = null;
            emprestimo = new Emprestimo();
        }
        return "/restrito/emprestimo.faces";
    }

    public void devolver(Emprestimo em) {
        emprestimo = em;
        emprestimo.setDataDevolucao(new Date());
    }

    public String devolucaoCodigoBarras() {
        if ((this.codAcervo == null) || (this.codAcervo < 1)) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Código do acevo incorreto!", null));
            return "/restrito/devolucao.faces";
        } else {
            emprestimos = emprestimoDao().verificaDisponibilidadeAcervo(codAcervo);
            if (emprestimos.size() > 0) {
                emprestimo = emprestimos.get(0);
                emprestimo.setDataDevolucao(new Date());
                emprestimoDao().atualizar(emprestimo);
                this.codAcervo = null;
                emprestimo = new Emprestimo();
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Devolução Realizada com Sucesso!", null));
            } else {
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Acervo não encontrado para devolução!", null));
            }
            return null;
        }
    }

    public String confirmarDevolucao() {
        System.out.println(">>>>>>>>>>>> Devolução " + emprestimo.getAcervo().getTitulo().getDescricao() + "  Codigo " + emprestimo.getCodEmprestimo());
        if (emprestimo.getCodEmprestimo() != null || emprestimo.getCodEmprestimo() > 0) {
            emprestimo.setDataDevolucao(new Date());
            emprestimoDao().atualizar(emprestimo);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Devolução Realizada com Sucesso!", null));
            this.codAcervo = null;
            emprestimo = new Emprestimo();
            emprestimos = emprestimoDao().listarImprestimoPendentesUsuario(usuarioLogado().getCodFuncionario());
        } else {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Digite o codigo do acevo para solicitar a devolução!", null));
        }
        return "/restrito/devolucao.faces";
    }

    public String cancelar() {
        this.codAcervo = null;
        emprestimo = null;
        return "/restrito/devolucao.faces";
    }

    public Emprestimo getEmprestimo() {
        if (emprestimo == null) {
            emprestimo = new Emprestimo();
        }
        return emprestimo;
    }

    public void setEmprestimo(Emprestimo emprestimo) {
        this.emprestimo = emprestimo;
    }

    @PostConstruct
    public void getListaEmprestimo() {
        /*if (codAcervo != null && codAcervo > 0) {
         solicitarEmprestimo2();
         }*/
        if (emprestimos == null) {
            emprestimos = emprestimoDao().listarImprestimoPendentesUsuario(usuarioLogado().getCodFuncionario());
        }
    }

    public List<Emprestimo> getEmprestimos() {
        return emprestimos;
    }

    public void setEmprestimos(List<Emprestimo> emprestimos) {
        this.emprestimos = emprestimos;
    }

    public Integer getCodAcervo() {
        return codAcervo;
    }

    public void setCodAcervo(Integer codAcervo) {
        this.codAcervo = codAcervo;
    }

    public Acervo getAcervo() {
        return acervo;
    }

    public void setAcervo(Acervo acervo) {
        this.acervo = acervo;
    }

    public List<Acervo> getAcervos() {
        return acervos;
    }

    public void setAcervos(List<Acervo> acervos) {
        this.acervos = acervos;
    }

}
